//ES5键值对重名。例如：
function people1(name, age) {
    return {
        name: name,
        age: age
    };
}
//键值对重名，ES6可以简写如下：
function people2(name, age) {
    return {
        name,
        age
    };
}
//ES6 同样改进了为对象字面量方法赋值的语法。ES5为对象添加方法：
const people3 = {
    name: 'lux',
    getName: function() {
        console.log(this.name)
    }
}
//ES6通过省略冒号与 function 关键字，将这个语法变得更简洁
const people4 = {
    name: 'lux',
    getName () {
        console.log(this.name)
    }
}

/*对象新增方法*/
//1.Object.is()  判断两者是否相等(与双等号判断有所不同)
console.log(Object.is('aaa','aaa'))   //true
console.log(NaN == NaN)   //false
console.log(Object.is(NaN,NaN))   //true
console.log(+0 == -0)  //true
console.log(Object.is(+0,-0))   //false

//2.Object.assign() 合并对象，如若有相同项，后者覆盖前者
let j1 = {a:1}
let j2 = {b:2}
let j3 = {c:3}
let obj = Object.assign({},j1,j2,j3)
let obj2 = Object.assign(j1,j2,j3,{c:4})
console.log(obj)  //{ a: 1, b: 2, c: 3 }
console.log(obj2)  //{ a: 1, b: 2, c: 4 }
//assign()用法：复制对象、合并参数
//利用其覆盖的特点，可以在封装方法时添加默认参数
//例：封装Ajax
function ajax(options){
	let defaults = {
		type:'get',
		header:'',
		data:{}
	}
	let args = Object.assign({},defaults,options)
	//...
	return args
}
console.log(ajax({type:'post'}))  //{ type: 'post', header: '', data: {} }

/*如下遍历方法为ES2017引入*/

//3.Object.keys()、Object.values()、Object.entries()
for(key of Object.keys(obj)){
	console.log(key)
}  //a b c
for(value of Object.values(obj)){
	console.log(value)
}  //1 2 3
for(entrie of Object.entries(obj)){
	console.log(entrie)
}  //[ 'a', 1 ] [ 'b', 2 ] [ 'c', 3 ]

//也可以用解构直接实现上面功能：
for([key,val] of Object.entries(obj)){
	console.log(key,val)
}  //a 1 b 2 c 3
//另一种写法，直接解构Object
let {keys,values,entries} = Object
for(key of keys(obj)){
	console.log(key)
} //a b c
for(value of values(obj)){
	console.log(value)
} //0 1 2
//使用for.in遍历和for.of不同点在于：for.in方法遍历出的只能是值
for(key in keys(obj)){
	console.log(key)
} //0 1 2